package com.shen.lock8;

import java.util.concurrent.TimeUnit;

public class EightLock04 {
    public static void main(String[] args) {
        //new了两个不同的Phone对象
        Phone04 phone1=new Phone04();
        Phone04 phone2=new Phone04();

        new Thread(()->{
            phone1.sendSms();
        },"A").start();

        //等待
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone2.call();
        },"B").start();

        /**
         * 打电话
         * 发短信
         */
    }
}


class Phone04{
    /**
     * 不同对象况下：是先打印 【发短信】 还是 【打电话】
     * 答案：打电话
     * 分析：
     * 这里使用的synchronized关键字，而synchronized修饰的是方法时，锁的是调用该方法的使用者
     * 而在线程调用时是
     * 线程A 使用的是phone1调用sendSms()方法
     * 线程B 使用的是phone2调用call()方法
     * 两个不是一个对象，拿的锁也不是同一把锁
     *
     *
     */
    public synchronized void sendSms(){
        //等待
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }

    // 没有synchronized 没有static 就是普通方式
    public void hello(){
        System.out.println("hello");
    }
}
